/*
 * CS_READ_MAIL_LIST.cpp
 *
 *  Created on: 2013. 5. 21.
 *      Author: the2
 */

#include "../../Command.h"
#include "../../User.h"
#include "../../NLogic/MailBox.h"

namespace ProjectZ { namespace NCommand {

void Command::CS_READ_MAIL_LIST(User * pUser, ::Network::Packet * pPacket)
{
/*	//받은 편지 리스트 요청
	CS_READ_MAIL_LIST			0x1202
	{
		u8			u8page;							// 페이지 ( MAX : 7 )
	}

	//받은 편지 리스트 요청
	SC_READ_MAIL_LIST			0x1203
	{
		s16 		ack;
		u8			u8has_nextpage;					// 페이지 ( MAX : 7 )

		u8 			u8searched_mail_count;			// 검색된 편지 갯수 (MAX 50, 1주일 지난 편지중 읽은 편지는 자동 삭제, 안읽은 편지는 삭제하지않음, 첨부가 있는경우 1주일이 지나도 삭제 되지않음!)
		{
			u64		u64mail_seq;					// 메일 일련 번호
			u8		u8is_read;						// 0: 미열람, 1: 열람
			u32		u32user_seq;					// 보낸 사람 Seq
			str		strSend_id;		 				// 보낸 사람 아이디 ( Max : 80 bytes )
			str		strmail_message;				// 메일 내용. ( Max : 180 bytes )
			str		strimage_url;					// 프로필 이미지 URL.
		}
	}*/

	PREPARE_PACKET;

	uint8_t reqPage	= 0;

	*pPacket >> reqPage;

	DEBUGLOG("CS_READ_MAIL_LIST : reqPage=%d", reqPage);

	if (reqPage > 7)
	{
		DEBUGLOG("CS_READ_MAIL_LIST : reqPage > 7!! reqPage=%d", reqPage);

		// 응답
		::Network::Packet * pAck = ::Network::GETPACKETPOOL()->SEND_NEW();
		*pAck << static_cast<int16_t>(ACK_OK);
		*pAck << static_cast<uint8_t>(0);
		*pAck << static_cast<uint8_t>(0);
		pAck->MakePacket(CMD_SC_READ_MAIL_LIST);
		pUser->Send(pAck);
		return;
	}

	NLogic::MailBox * pMailBox = pUser->GetMailBox();
	if (NULL == pMailBox)
	{
		DEBUGLOG("CS_READ_MAIL_LIST : pMailBox is NULL!!!!");
		return;
	}

	// 클라이언트에서 요청한 페이지의 데이터만 추출.
	int skipIndex	= 1;
	int startIndex	= ((reqPage - 1) * 50) + 1;
	int endIndex	= reqPage * 50;

	std::vector<NLogic::MailBox::Mail *> clsMailVector;

	auto iter = pMailBox->GetMailTree().rbegin();

	for ( ; iter != pMailBox->GetMailTree().rend(); ++iter, ++skipIndex)
	{
		if (skipIndex < startIndex)
			continue;

		if (skipIndex > endIndex)
			break;

		clsMailVector.push_back(iter->second);
	}

	// 다음 페이지의 데이터가 있는지 검사한다.
	int nextPage = reqPage + 1;
	if (clsMailVector.size() < 50)
		nextPage = 0;

	// 응답
	::Network::Packet * pAck = ::Network::GETPACKETPOOL()->SEND_NEW();

	*pAck << static_cast<int16_t>(ACK_OK);
	*pAck << static_cast<uint8_t>(nextPage);
	*pAck << static_cast<uint8_t>(clsMailVector.size());

	for (int i = 0; i < static_cast<int>(clsMailVector.size()); i++)
	{
		*pAck << clsMailVector[i]->GetMailSeq();
		*pAck << static_cast<uint8_t>(clsMailVector[i]->GetData().mail_status);
		*pAck << static_cast<uint8_t>(clsMailVector[i]->GetData().gift_status);
		*pAck << clsMailVector[i]->GetData().send_user_seq;
		*pAck << clsMailVector[i]->GetData().send_user_nickname.c_str();
		*pAck << clsMailVector[i]->GetData().message.c_str();
		*pAck << clsMailVector[i]->GetData().send_user_imageurl.c_str();
	}

	pAck->MakePacket(CMD_SC_READ_MAIL_LIST);
	pUser->Send(pAck);
}

} /*NCommand*/ } /*ProjectZ*/
